<?php
//Einen Text in Longzahlen umwandeln
function _str2long($data)
    {
    $n = strlen($data);
    $tmp = unpack('N*', $data);
    $data_long = array();
    $j = 0;

    foreach ($tmp as $value) $data_long[$j++] = $value;
    return $data_long;
    }

//Longzahlen in Text umwandeln
function _long2str($l)
    {
    return pack('N', $l);
    }


//Algorithmus um array: $v mit array: $k zu verschluesseln
function xtea_algo_encrypt($v,$k)
   {

   $y=$v[0];
   $z=$v[1];
   $sum=0;
   $delta=0x9e3779b9;


   /* start cycle */
   for ($i=0; $i<32; $i++)
      {
      $y      = _add($y,
                        _add($z << 4 ^ _rshift($z, 5), $z) ^
                             _add($sum, $k[$sum & 3]));

      $sum    = _add($sum, $delta);

      $z      = _add($z,
                        _add($y << 4 ^ _rshift($y, 5), $y) ^
                              _add($sum, $k[_rshift($sum, 11) & 3]));

      }
   /* end cycle */

   $v[0]=$y;
   $v[1]=$z;

   return $v;
   }

//Algorithmus um array: $v mit array: $k zu entschl&uuml;sseln
function xtea_algo_decrypt($v, $k)
   {
   $y=$v[0];
   $z=$v[1];
   $delta=0x9e3779b9;
   $sum=0xC6EF3720;
   $n=32;

   /* start cycle */
   for ($i=0; $i<32; $i++)
      {
        		$z      = _add($z,
                      		 -(_add($y << 4 ^ _rshift($y, 5), $y) ^
                                    _add($sum, $k[_rshift($sum, 11) & 3])));
            $sum    = _add($sum, -$delta);
            $y      = _add($y,
                            -(_add($z << 4 ^ _rshift($z, 5), $z) ^
                                    _add($sum, $k[$sum & 3])));

      }
   /* end cycle */

   $v[0]=$y;
   $v[1]=$z;

   return $v;
   }



//Verschluesseln
function xtea_encrypt($text,$key)
   {
   $ausgabe = "";

   $text .= "|";
   $n = strlen($text);
   if($n%4 != 0) $lng = ($n+(4-($n%4)));
   $text = str_pad($text, $lng, ' ');


   $v = _str2long($text);
   for($i = 0; $i<count($v); $i+=2) $geheim[] = xtea_algo_encrypt(array($v[$i],$v[$i+1]),$key);


   for($i = 0; $i<count($geheim); $i++)
     {
     $ausgabe .= _long2str($geheim[$i][0]);
     $ausgabe .= _long2str($geheim[$i][1]);
     }

   return base64_encode($ausgabe);
   }

//Entschluesseln
function xtea_decrypt($text, $key)
   {
   $ausgabe = "";

   $geheim = _str2long(base64_decode($text));

   $klar = array();
   for($i = 0; $i<count($geheim); $i+=2) $klar[] = xtea_algo_decrypt(array($geheim[$i],$geheim[$i+1]),$key);

   for($i = 0; $i<count($klar); $i++)
      {
      $ausgabe .= _long2str($klar[$i][0]);
      $ausgabe .= _long2str($klar[$i][1]);
      }

	$ausgabe = trim($ausgabe);
   $ausgabe = substr($ausgabe,0,strrpos($ausgabe,"|"));

   return $ausgabe;
   }

function _rshift($integer, $n)
    {
        // convert to 32 bits
        if (0xffffffff < $integer || -0xffffffff > $integer) {
            $integer = fmod($integer, 0xffffffff + 1);
        }

        // convert to unsigned integer
        if (0x7fffffff < $integer) {
            $integer -= 0xffffffff + 1.0;
        } elseif (-0x80000000 > $integer) {
            $integer += 0xffffffff + 1.0;
        }

        // do right shift
        if (0 > $integer) {
            $integer &= 0x7fffffff;                     // remove sign bit before shift
            $integer >>= $n;                            // right shift
            $integer |= 1 << (31 - $n);                 // set shifted sign bit
        } else {
            $integer >>= $n;                            // use normal right shift
        }

        return $integer;
    }


    function _add($i1, $i2)
    {
        $result = 0.0;

        foreach (func_get_args() as $value) {
            // remove sign if necessary
            if (0.0 > $value) {
                $value -= 1.0 + 0xffffffff;
            }

            $result += $value;
        }

        // convert to 32 bits
        if (0xffffffff < $result || -0xffffffff > $result) {
            $result = fmod($result, 0xffffffff + 1);
        }

        // convert to signed integer
        if (0x7fffffff < $result) {
            $result -= 0xffffffff + 1.0;
        } elseif (-0x80000000 > $result) {
            $result += 0xffffffff + 1.0;
        }

        return $result;
    }  


?>